import axios from 'axios';
import router from '@/router';

// 注意：基础配置已在main.ts中设置，此处不再重复配置
// 允许携带凭证（cookies等）
axios.defaults.withCredentials = true;

const API_URL = '/api/auth/';

// 用户信息相关常量
const USER_KEY = 'user';
const USER_ROLE_KEY = 'userRole';

/**
 * 检查用户是否已登录
 * @returns 是否已登录
 */
const isUserLoggedIn = (): boolean => {
  const user = localStorage.getItem(USER_KEY);
  return !!user;
};

/**
 * 登录请求
 * @param username 用户名
 * @param password 密码
 * @returns 登录响应
 */
export const login = async (username: string, password: string) => {
  try {
    // 添加防抖，避免重复请求
    if (localStorage.getItem('login_request_in_progress') === 'true') {
      return Promise.reject(new Error('登录请求正在处理中，请勿重复提交'));
    }
    
    localStorage.setItem('login_request_in_progress', 'true');
    
    const response = await axios.post(API_URL + 'login', { username, password });
    
    // 保存用户信息
    if (response.data && response.data.username) {
      // 确保角色格式统一为大写
      const userData = {
        ...response.data,
        role: response.data.role.toUpperCase()
      };
      setAuthData(userData);
    }
    
    localStorage.removeItem('login_request_in_progress');
    return response;
  } catch (error) {
    localStorage.removeItem('login_request_in_progress');
    throw error;
  }
};

/**
 * 检查认证状态
 * @returns 认证检查结果
 */
export const checkAuthStatus = async () => {
  try {
    const response = await axios.get(API_URL + 'user');
    if (response.data && response.data.username) {
      // 确保角色格式统一为大写
      const userData = {
        ...response.data,
        role: response.data.role.toUpperCase()
      };
      setAuthData(userData);
      return userData;
    }
    return null;
  } catch (error) {
    clearAuthData();
    return null;
  }
};

/**
 * 获取当前用户信息
 * @returns 当前用户信息
 */
export const getCurrentUser = () => {
  const userStr = localStorage.getItem(USER_KEY);
  if (userStr) {
    try {
      return JSON.parse(userStr);
    } catch (e) {
      clearAuthData();
      return null;
    }
  }
  return null;
};

/**
 * 获取当前用户角色
 * @returns 用户角色
 */
export const getUserRole = () => {
  return localStorage.getItem(USER_ROLE_KEY);
};

/**
 * 设置用户信息
 * @param user 用户信息
 */
export const setAuthData = (user: any) => {
  // 确保角色格式统一为大写
  const userWithUpperRole = {
    ...user,
    role: user.role.toUpperCase()
  };
  localStorage.setItem(USER_KEY, JSON.stringify(userWithUpperRole));
  localStorage.setItem(USER_ROLE_KEY, userWithUpperRole.role);
};

/**
 * 清除认证数据
 */
export const clearAuthData = () => {
  localStorage.removeItem(USER_KEY);
  localStorage.removeItem(USER_ROLE_KEY);
};

/**
 * 退出登录
 * @returns 退出请求结果
 */
export const logout = async () => {
  try {
    // 调用后端注销接口
    await axios.post(API_URL + 'logout');
  } catch (error) {
    console.warn('后端注销失败，但会继续本地注销', error);
  } finally {
    // 无论后端是否成功注销，都清除本地认证数据
    clearAuthData();
  }
};

/**
 * 检查是否已认证
 * @returns 是否已认证
 */
export const isAuthenticated = async () => {
  try {
    // 检查本地是否有用户信息
    if (!isUserLoggedIn()) return false;
    
    // 调用后端接口验证session
    const response = await axios.get(API_URL + 'user');
    return response.status === 200;
  } catch (error) {
    return false;
  }
};

// 默认导出所有方法
export default {
  login,
  checkAuthStatus,
  getCurrentUser,
  getUserRole,
  setAuthData,
  clearAuthData,
  logout,
  isAuthenticated
}; 